package com.czk.registerBean;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanDefinitionHolder;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionReaderUtils;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.beans.factory.support.GenericBeanDefinition;

/**
 * 在 Spring 的 Bean 管理中，所有的 Bean 最终都会被注册到类 DefaultListableBeanFactory 中，以上这部分代码主要的内容包括：
 * <p>
 * 实现 BeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry方法，获取 Bean 注册对象。
 * 定义 Bean，GenericBeanDefinition，这里主要设置了我们的代理类工厂。
 * 创建 Bean 定义处理类，BeanDefinitionHolder，这里需要的主要参数；定义 Bean 和名称 setBeanClass(ProxyBeanFactory.class)。
 * 最后将我们自己的bean注册到spring容器中去，registry.registerBeanDefinition()
 *
 * @Author:ChenZhangKun
 * @Date: 2021/4/2 11:40
 */
public class RegisterBeanFactory implements BeanDefinitionRegistryPostProcessor {
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {
        System.out.println("注册iUserDao了");
        // 通用对象描述
        GenericBeanDefinition genericBeanDefinition=new GenericBeanDefinition();
        // 设置工厂类
        genericBeanDefinition.setBeanClass(ProxyBeanFactory.class);
        BeanDefinitionHolder beanDefinitionHolder=new BeanDefinitionHolder(genericBeanDefinition,"iUserDao");
        // 注册
        BeanDefinitionReaderUtils.registerBeanDefinition(beanDefinitionHolder,beanDefinitionRegistry);
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {

    }
}
